# -*- coding: utf-8 -*-
"""
------------------------------------------------------------------------------
    File Name:  img_opr
    Author   :  wanwei1029
    Date     :  2018/2/10
    Desc     :  图片基本读，显示，写操作。
                函数原型：cv2.imread(filepath,flags)
                flags有三个参数：
                cv2.IMREAD_COLOR：默认参数，读入一副彩色图片，忽略alpha通道
                cv2.IMREAD_GRAYSCALE：读入灰度图片
                cv2.IMREAD_UNCHANGED：顾名思义，读入完整图片，包括alpha通道

                cv2.imshow(wname,img)
                cv2.imwrite(file_name，img，num)
                file_name如果没有路径信息的话，默认python文件所在目录。
                file_name要有后缀名以区分图片类型，要不会报错。
                对于jpg和png，num意义不同，jpg表示图片质量，1-100之间，默认95;png在0-3之间，默认3，表示压缩级别，超高图片越小。
                如果文件已经存在的话，imwrite不会覆盖原图像，也就是这个方法只会新增，不会修改图像。
------------------------------------------------------------------------------
"""
import cv2
import os


def read_img(img_path):
    img = cv2.imread(img_path)
    print(img)
    return img


def show_img(names, img):
    for i, name in enumerate(names):
        cv2.imshow(name, img[i])
    key = cv2.waitKey(0)
    if key == 32:
        cv2.destroyWindow(name)


def save_img(new_name, img):
    cv2.imwrite(new_name, img)


def flip(img):
    """
    flip不会改变原始图像，返回旋转后的图像
    cv2.flip(img,flipcode)
    flipcode=0沿x轴转,也就是上下翻转
    flipcode>0沿y轴转，也就是左右翻转
    flipcode<0沿x,y轴转，也就是上下，左右同时翻转
    :param img:
    :return:
    """
    flip0 = cv2.flip(img, 0)
    flip1 = cv2.flip(img, 1)
    flip_1 = cv2.flip(img, -1)
    name_list = ["origin", "flip0", "flip1", "flip_1"]
    img_list = [img, flip0, flip1, flip_1]
    show_img(name_list, img_list)


def gray_img(org_img):
    """
    将彩图转换为灰度图，也是二维的，但和直接读取灰度图还是有区别的，lena的图片,cvt转换的值偏小。
    灰度图可以转化为彩色图，也就是二维转三维的，但整体色彩没啥效果。
    如果将一个二维的图或图片路径错误，调用cv2.COLOR_RGB2GRAY，会报错：scn == 3 || scn == 4 in function cv::cvtColor
    :param org_img:
    :return:
    """
    gray_img = cv2.cvtColor(org_img, cv2.COLOR_RGB2GRAY)
    color_img = cv2.cvtColor(gray_img, cv2.COLOR_GRAY2BGR)
    print(color_img)
    name_list = ["origin", "gray_img", "color_img"]
    img_list = [org_img, gray_img, color_img]
    show_img(name_list, img_list)


if __name__ == '__main__':
    test_method = "gray_img"
    base_path = "./images"
    img_name = "lena.jpg"
    path = os.path.join(base_path,img_name)
    if test_method == "read_img":
        img = read_img(path)
        show_img(["lena"], [img])
        save_img(os.path.join(base_path, "new_lena.jpg"), img.copy())
    elif test_method == "flip":
        img = read_img(path)
        flip(img)
    elif test_method == "gray_img":
        img = read_img(path)
        gray_img(img)
